#include "cemail.h"

CEmail::CEmail(QObject *parent) :
    QObject(parent),
    _emailSelecionado("")
{
#if defined(USEMOBILITY)
    _servicoEmail = new QMessageService(this);
#endif

}

CEmail::~CEmail()
{
#if defined(USEMOBILITY)

#endif
}

void CEmail::EnviarEmails(int codigoVaga, const QString &contaEmailLocal, const QString &mensagem, const QString &curriculo)
{
#if defined(USEMOBILITY)
    CVagasItem *infoVaga = _vagas->LocalizarVaga(codigoVaga);    
    if (this->EnviarEmailEfetivamente(contaEmailLocal, mensagem, curriculo, infoVaga))
    {
        this->GuardarEnvio(infoVaga, mensagem);
    }
#endif
    emit emailsGerados();
    emit emailGerado(infoVaga);
}

void CEmail::EnviarEmails(const QString &contaEmailLocal, const QString &mensagem, const QString &curriculo)
{
#if defined(USEMOBILITY)
    if (_vagas) {
        QStringList anexos;
        if (QFile::exists(curriculo))
            anexos.append(curriculo);
        foreach(CVagasItem *item, _vagas->getVagas())
        {
            if (item->getMarcado())
            {
                if (!this->EnviarEmailEfetivamente(contaEmailLocal, mensagem, curriculo, item))
                {
                    qDebug() << "Erro ao enviar e-mail!";
                }
                else
                {
                    if (this->GuardarEnvio(item, mensagem))
                        emit emailGerado(item);
                }
            }
        }
    }
#endif
    _vagas->desmarcarTodos();
    emit emailsGerados();
}

void CEmail::ChecarEmails()
{
}

void CEmail::LimparEmails()
{
    QSqlQuery q(QSqlDatabase::database(CConfiguracao::c_basePrincipal));
    q.exec("delete from emailsEnviados");
    q.exec("vacuum");
    emit limpezaVagasContatadas();
}

#if defined(USEMOBILITY)
QMessageAccountId CEmail::IdContaEmail(const QString &email)
{
    QMessageManager man;
    QMessageAccountIdList lst = man.queryAccounts();
    foreach (QMessageAccountId idConta, lst)
    {
        QMessageAccount conta(idConta);
        if (conta.name() == email)
            return idConta;
    }
    return QMessageAccountId();
}
#endif

QStringList CEmail::getListaEmails()
{
#if defined(USEMOBILITY)
    QStringList retLista;
    QMessageManager man;    
    QMessageAccountIdList accLista = man.queryAccounts();
    foreach(QMessageAccountId idConta, accLista)
    {
        QMessageAccount conta(idConta);
        if ((conta.messageTypes() & QMessage::Email) == QMessage::Email)
            retLista.append(conta.name());
    }
    return retLista;
#else
    return QStringList();
#endif
}

QString CEmail::getEmailPadrao()
{
#if defined(USEMOBILITY)
    QMessageAccount acc;
    return QMessageAccount(acc.defaultAccount(QMessage::Email)).name();
#else
    return "";
#endif
}

bool CEmail::GuardarEnvio(CVagasItem *vaga, const QString mensagemEnviadaContato)
{
    QSqlQuery q(QSqlDatabase::database(CConfiguracao::c_basePrincipal));
    q.prepare("insert into emailsEnviados(vaga, dataContato, mensagemEmailContato) "
              "values (:vaga, :dataContato, :mensagemEmailContato)");
    q.bindValue(":vaga", vaga->getCodigo());
    q.bindValue(":dataContato", QDateTime::currentDateTime());
    q.bindValue(":mensagemEmailContato", mensagemEnviadaContato);
    q.exec();
    if (q.lastError().isValid())
        qDebug() << "GuardarEnvio:: " << q.lastError();
    return true;
}

bool CEmail::EnviarEmailEfetivamente(const QString contaEmailLocal, const QString &mensagem, const QString &curriculo, CVagasItem *vaga)
{
    QStringList anexos;
    if (QFile::exists(curriculo))
        anexos.append(curriculo);

#if defined(NOEMAIL)
    QMessageAddress objTo(QMessageAddress::Email, "segaaaa@gmail.com");
#else
    QMessageAddress objTo(QMessageAddress::Email, vaga->getContato());
#endif

    QMessage msg;
    msg.setType(QMessage::Email);
    msg.setTo(objTo);
    msg.setSubject(vaga->getSubjectEmail());
    msg.setBody(mensagem, "text/plain");
    QMessageAccountId conta = this->IdContaEmail(contaEmailLocal);
    qDebug() << "Conta de email: " << contaEmailLocal << conta.isValid();
    msg.setParentAccountId(conta);
    msg.appendAttachments(anexos);

    return _servicoEmail->send(msg);
}

